#include"age.h"
#include<windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include "../SDL/SDL.h"
#   pragma comment (lib, "../SDL/SDLmain.lib")  
#   pragma comment (lib, "../SDL/SDL.lib")  
#   pragma comment (lib, "OpenGL32.lib")  
#   pragma comment (lib, "Glu32.lib")  

#include<iostream>
using namespace std;
 
int main( int argc, char* argv[] )
{
	age::kernal::IDevice *device=age::createDevice(age::AGE_OPENGL_SDL,400,400,32,false);
	device->setWindowCaption(age::kernal::String("Atomic Game Engine "));
	age::render::IRender *render=device->getRender();
	render->setBackgroundColor(age::kernal::Color(140,100,200,255));
	age::render::SVertex v ; 
	vector<age::render::SVertex> vertex ; 
	vector<unsigned int> indexList ;

	age::render::SVideoInfo VideoInfo;
	render->getVideoInformation(VideoInfo);

	age::kernal::SModeList modes=device->getModeList();

	cout<<modes.actualBits<<" "<<modes.actualScreenHeight<<" "<<modes.actualScreenWidth<<endl;
	for(int i=0;i<modes.modeCount;i++)
	{
		cout<<modes.width[i]<<" "<<modes.height[i]<< " " <<modes.bits[i]<<endl;
	}

	cout<<VideoInfo.Renderer<<"\n"<<VideoInfo.Vendor<<"\n"<<VideoInfo.Name<<"\n"<<VideoInfo.Version<<endl;
	//vertex.resize(6);
	v.set(age::math::Vector3f(-50,50,0),age::math::Vector3f(0,0,0),age::kernal::Color(255,255,255,255));
	vertex.push_back(v);
	v.set(age::math::Vector3f(50,50,0),age::math::Vector3f(1,0,0),age::kernal::Color(255,255,255,255));
	vertex.push_back(v);
	v.set(age::math::Vector3f(50,-50,0),age::math::Vector3f(1,1,0),age::kernal::Color(255,255,255,255));
	vertex.push_back(v);
	v.set(age::math::Vector3f(-50,-50,0),age::math::Vector3f(0,1,0),age::kernal::Color(255,255,255,255));
	vertex.push_back(v);

	indexList.push_back(0);indexList.push_back(1);indexList.push_back(2);
	indexList.push_back(2);indexList.push_back(3);indexList.push_back(0);
	


//--------------------------------------------------

 	age::render::ITexture *texture1 = render->createTexture("logo.jpg",false);
 	age::render::ITexture *texture2 = render->createTexture("image_tga.tga",false);
	texture2->generateColorKey(age::kernal::Color(255,0,0,0));
	texture2->rebuild(false);
	texture2->setFilterMode(age::render::AGE_TEXTURE_FILTER_NONE);
	//Mask Image 
	age::render::ITexture *texture3 = render->createTexture();
	if(texture3->build("O.bmp","CM.bmp",false)==false)
		return 0;
	age::render::ITexture *texture4 = render->createTexture("O.bmp",false);
	age::render::ITexture *texture5 = render->createTexture("CM.bmp",false);

 //--------------------------------------------------

	std::cout<<"texture 1 dimensions "<<texture1->getWidth() <<"*"<<texture1->getHeight()<<std::endl;
	std::cout<<"texture 2 dimensions "<<texture2->getWidth() <<"*"<<texture2->getHeight()<<std::endl;
	std::cout<<"texture 3 dimensions "<<texture3->getWidth() <<"*"<<texture3->getHeight()<<std::endl;
//	std::cout<<"texture 4 dimensions "<<texture4->getWidth() <<"*"<<texture4->getHeight()<<std::endl;
	std::cout<<"max texture size available is : " << render->getMaxTextureSize()<<" pixel "<<std::endl;

	age::math::Matrix4f m1; 
	age::math::Matrix4f m2;
	age::math::Matrix4f m3;
	age::math::Matrix4f result_1;

 
	
		
	float x=0;
	float angle=0;
	while(device->run())
	{
		device->sleep(1);
		
  		if(device->Input.getKeyboardInput()->key==age::kernal::AGE_ESCAPE)
			device->stop();
		angle+=.1f;
		if(angle>360)
			angle=0;
		m1.setTranslate(age::math::Vector3f(120,120,0));
		m2.setRotateZ(angle);
		m3.setScale(age::math::Vector3f(2,2,1));

		//       :
		// column-major order 
		//        
		// m2 then m1
		// Rotation before Translattion
		//result_1=m1 * m2  ;  // example


		result_1=m1 * m2 * m3 ;  

		
  
  		render->setTranslateProjectionMatrix(age::math::Vector3f(200,200,0));
		render->beginRender();
			render->setDrawDirection(age::render::EDrawDirection::AGE_CCW);
	 		render->drawTrianglesList(vertex,indexList,texture1,result_1);	
			render->drawImage(0,0,100,100,age::kernal::Color(255,255,255,255),false,texture1);
 	    	render->drawImage(120,0,220,100,age::kernal::Color(255,255,255,255),true,texture2);
			render->drawImage(0,120,320,420,age::kernal::Color(255,255,255,255),true,texture3);
 	   	//	render->drawMaskImage(0,120,300,520,age::kernal::Color(255,255,255,255),texture4,texture5);
		render->endRender();
			

	}

	cout<<"end "<<endl;

	device->closeDevice();
 	texture1->release();
	texture2->release();
	texture3->release();
//	texture4->release();

	delete texture1;
	delete texture2;
	delete texture3;
//	delete texture4;
	delete device;


	return 0 ;
}
